/**
 * iframe消息通信工具类
 * 用于处理iframe与父窗口之间的消息传递
 */
class IframeMessenger {
    constructor() {
        this.isInIframe = window.self !== window.top
        this.listeners = new Map()
        this.init()
    }

    /**
     * 初始化消息监听器
     */
    init() {
        if (this.isInIframe) {
            window.addEventListener('message', this.handleMessage.bind(this))
        }
    }

    /**
     * 处理接收到的消息
     */
    handleMessage(event) {
        const { type, data } = event.data
        if (this.listeners.has(type)) {
            const callbacks = this.listeners.get(type)
            callbacks.forEach(callback => {
                try {
                    callback(data, event)
                } catch (error) {
                    console.error(`处理消息 ${type} 时出错:`, error)
                }
            })
        }
    }

    /**
     * 向父窗口发送消息
     * @param {string} type - 消息类型
     * @param {any} data - 消息数据
     * @param {string} targetOrigin - 目标源，默认为 '*'
     */
    sendToParent(type, data, targetOrigin = '*') {
        if (!this.isInIframe || !window.parent) {
            console.warn('不在iframe环境中，无法发送消息到父窗口')
            return false
        }

        const message = {
            type,
            data,
            timestamp: Date.now(),
            source: 'iframe-child'
        }

        try {
            window.parent.postMessage(message, targetOrigin)
            console.log('向父窗口发送消息:', message)
            return true
        } catch (error) {
            console.error('发送消息到父窗口失败:', error)
            return false
        }
    }

    /**
     * 监听来自父窗口的消息
     * @param {string} type - 消息类型
     * @param {function} callback - 回调函数
     */
    onMessage(type, callback) {
        if (!this.listeners.has(type)) {
            this.listeners.set(type, [])
        }
        this.listeners.get(type).push(callback)
    }

    /**
     * 移除消息监听器
     * @param {string} type - 消息类型
     * @param {function} callback - 要移除的回调函数
     */
    offMessage(type, callback) {
        if (this.listeners.has(type)) {
            const callbacks = this.listeners.get(type)
            const index = callbacks.indexOf(callback)
            if (index > -1) {
                callbacks.splice(index, 1)
            }
        }
    }

    /**
     * 检查是否在iframe中
     */
    get inIframe() {
        return this.isInIframe
    }

    /**
     * 销毁实例
     */
    destroy() {
        if (this.isInIframe) {
            window.removeEventListener('message', this.handleMessage.bind(this))
        }
        this.listeners.clear()
    }
}

// 创建单例实例
const iframeMessenger = new IframeMessenger()

export default iframeMessenger